package me.zhengjie.modules.workflow.service;

import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.task.Task;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * 工作流接口服务
 * @description: WorkFlowService <br>
 * @date: 2020/10/18 10:39 <br>
 * @author: wangz <br>
 * @version: 1.0 <br>
 */
public interface WorkFlowService {

    /**
     * 启动流程
     * @param pdKey 流程Key
     * @param businessKey 业务外键
     * @param variables 流程相关变量
     * @return
     */
    String startWorkflow(String pdKey, String businessKey, Map<String,Object> variables);

    /**
     * 继续流程
     * @param taskId
     * @param variables
     */
    void continueWorkflow(String taskId, Map variables);

    /**
     * 委托流程
     * @param taskId
     * @param variables
     */
    void delegateWorkflow(String taskId, Map variables);

    /**
     * 结束流程
     * @param pProcessInstanceId
     * @param deleteReason
     */
    void endWorkflow(String pProcessInstanceId,String deleteReason);

    /**
     * 获取当前的任务节点
     * @param taskId
     * @return
     */
    String getCurrentTask(String taskId);

    /**
     * 根据用户id查询待办流程实例ID集合
     * @param userId
     * @param pdKey
     * @param pageNo
     * @param pageSize
     * @return
     */
    List<String> findUserProcessIds(String userId, String pdKey, Integer pageNo, Integer pageSize);


    /**
     * 获取流程图像，已执行节点和流程线高亮显示
     * @param pProcessInstanceId
     * @param response
     */
    void getProcessImage(String pProcessInstanceId, HttpServletResponse response);

    /**
     * 获取高亮流程
     * @param bpmnModel
     * @param historicActivityInstances
     * @return
     */
    List<String> getHighLightedFlows(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances);


    /**
     * 部署流程
     * @param id
     */
    void deploy(String id);

    /**
     * 查看流程图
     * @param pdId 流程定义ID
     * @param response
     */
    void viewImage(String pdId, HttpServletResponse response);

    /**
     * 根据模型id获取bpmn文件
     * @param mid
     * @param response
     */
    void downloadBpmn(String mid, HttpServletResponse response);

    /**
     * 任务签收
     * @param id 任务ID
     * @param param
     */
    void signFor(String id, Map param);

    /**
     * 查看流程踪迹图
     * @param pdId
     * @param response
     */
    void viewProcessTrace(String pdId, HttpServletResponse response);

    /**
     * 流程回退
     * @param taskId
     */
    void rollBack(String taskId);

    /**
     * 部署资源
     * @param file
     */
    void deployResource(MultipartFile file);

    /**
     * 流程拒绝
     * @param taskId 任务ID
     * @param user
     */
    void reject(String taskId, String user);

    /**
     * 返回第一个节点
     *
     * @param taskId
     * @param user
     */
    void rollbackFirstask(String taskId, String user);

    /**
     * 指派，将任务指派给某个人
     * @param processInstanceId 流程实例ID
     * @param roleId 指派给角色
     * @param userId 被指派人ID
     */
    void reassignment(String processInstanceId,String roleId, String userId);


    /**
     * 征询
     *
     * @param taskId 任务ID
     * @param users 候选征询人
     * @param user 征询发起人
     */
    void inquire(String taskId,List<String> users,String user);


    /**
     * 征询回复
     *
     * @param taskId
     * @param toUser
     * @param user
     */
    void reply(String taskId, String toUser, String user);

    /**
     *  任务转办
     *  直接将办理人换成别人，这时任务的拥有者不再是转办人。
     * @param taskId
     * @param userId
     */
    void transfer(String taskId,String userId);




}
